Android 的许多 LED 手电筒 API 问题。我害怕再问一个,但这里有..
使用久经考验的真正 FLASH_MODE_TORCH,我能够对我的三星 Galaxy SII 感到满意并打开 LED 闪光灯。在我朋友的 Galaxy Nexus 上,没有这样的运气。在我另一个朋友的 Droid X 上也没有。
我注意到似乎需要大量设备特定的本地 IOCTL 调用。Galaxy Nexus 是这种情况吗?我如何找到编程的参考?
我正在做标准的 FLASH_MODE_TORCH/”flash-mode”=”torch”, startPreview() 链。
有点令人失望的是,这个看似标准的 API 似乎并没有那么普遍。
我发现有些设备需要 SurfaceView 才能打开 LED。
SurfaceView preview = (SurfaceView) findViewById(R.id.PREVIEW); SurfaceHolder mHolder = preview.getHolder(); mHolder.addCallback(this); Camera mCamera = Camera.open(); mCamera.setPreviewDisplay(mHolder); // Turn on LED Parameters params = mCamera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_TORCH); mCamera.setParameters(params); mCamera.startPreview(); ... // Turn off LED Parameters params = mCamera.getParameters(); params.setFlashMode(Parameters.FLASH_MODE_OFF); mCamera.setParameters(params); mCamera.stopPreview(); mCamera.release();
您的活动需要实现 SurfaceHolder.Callback:
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} public void surfaceCreated(SurfaceHolder holder) { mHolder = holder; mCamera.setPreviewDisplay(mHolder); } public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mHolder = null; }
表面视图必须可见,android:visibility="invisible"否则高度和宽度为 0 将不起作用。不幸的是,我没有找到一个很好的解决方案来隐藏它,所以我只是给它一个 1x1dip 的大小并将它放在一个按钮下面..
android:visibility="invisible"
**(扩展上面的段落[没有足够的代表来回复,但觉得它很有用])在您当前内容视图的 XML 中的某处,您想要:
<SurfaceView android:id="@+id/PREVIEW" android:layout_width="1dip" android:layout_height="1dip"/>
如果你有它在一个相对布局(首选),你也可以做 alignParentLeft/Bottom 把它塞在角落里。这种方法适用于我的 Galaxy Nexus,但它是 Droid X 的一个已知问题(手机端)(无论如何都是 .621 更新),并且不适用于我的。很好的答案,timosch!